#pragma warning disable 108
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using Cephei;
using Cephei.Generic;
namespace Cephei.QL.Times
{
     // <summary> 
	// ! Payment schedule
	// </summary>
    [Guid ("A0D05018-C206-47a7-87F2-10B6471ED4FD"),ComVisible(true)]
	public interface ISchedule 
	{
		///////////////////////////////////////////////////////////////
        // Methods
        //
        
		 DateTime At(UInt64 i);
        
		 QL.Times.BusinessDayConventionEnum BusinessDayConvention {get;}
        
		 Cephei.QL.Times.ICalendar Calendar {get;}
        
		 DateTime Date(UInt64 i);
        
		 Cephei.IVector<DateTime> Dates {get;}
        
		 Boolean Empty {get;}
        
		 DateTime EndDate {get;}
        
		 Boolean EndOfMonth {get;}
        
		 Boolean IsRegular(UInt64 i);
        
		 DateTime NextDate(DateTime refDate);
        
		 DateTime PreviousDate(DateTime refDate);
        
		 QL.Times.DateGeneration.RuleEnum Rule {get;}
        
		 UInt64 Size {get;}
        
		 DateTime StartDate {get;}
        
		 Cephei.QL.Times.IPeriod Tenor {get;}
        
		 QL.Times.BusinessDayConventionEnum TerminationDateBusinessDayConvention {get;}
    }

    // <summary> 
	// ! Payment schedule Factory
	// </summary>
   	[ComVisible(true)]
    public interface ISchedule_Factory // : Collection_Factory<ISchedule, ICell<ISchedule>>
    {
        ///////////////////////////////////////////////////////////////
        // Factory methods
        //
        
	    ISchedule Create ();
        
	    ISchedule Create (DateTime effectiveDate, DateTime terminationDate, Cephei.QL.Times.IPeriod tenor, Cephei.QL.Times.ICalendar calendar, QL.Times.BusinessDayConventionEnum convention, QL.Times.BusinessDayConventionEnum terminationDateConvention, QL.Times.DateGeneration.RuleEnum rule, Boolean endOfMonth, Microsoft.FSharp.Core.FSharpOption<DateTime> firstDate, Microsoft.FSharp.Core.FSharpOption<DateTime> nextToLastDate);
        
	    ISchedule Create (Cephei.IVector<DateTime> dates, Microsoft.FSharp.Core.FSharpOption<Cephei.QL.Times.ICalendar> calendar, Microsoft.FSharp.Core.FSharpOption<QL.Times.BusinessDayConventionEnum> convention);
    }
}

